Introducción al procesamiento transaccional

Introducción

Normalmente cuando un usuario de un sistema realiza una operación, esta se compone internamente de múltiples sub operaciones que se perciben como un todo. Con esto en mente, describimos una transacción como un conjunto de operaciones que forman una unidad lógica de trabajo.

 

Ejemplo: Transferencia de fondos entre dos cuentas bancarias.

Transferir x€ desde una cuenta A hacia una cuenta B

Esta operación tiene varias asociadas:

  • Comprobar que en A hay fondos suficientes.

  • Restar X del balance de A.

  • Sumar X al balance de B.

 

Una transacción debe ejecutarse completamente o no ejecutarse.

 

Transaccion

 

Al estar compuesta por diferentes sub operaciones, puede suceder que un error en cualquiera de ellas, ocasione que la transacción no finalice. En este caso, el sistema gestor de base de datos debe devolver a la base de datos al estado anterior en el que se encontraba antes de iniciar la transacción.

 

Propiedades ACID

Para que la base de datos mantenga su integridad al ejecutar transacciones, se deben cumplir las siguientes propiedades:

 

Estados de una transacción

Los estados en los que puede estar una transacción son:

Activa: es el estado inicial, permanece en este estado durante su ejecución.
Parcialmente comprometida: pasa a este estado después de ejecutarse la última instrucción.
Después de este estado pasaría al estado de comprometida.
Fallida: conmuta a este estado cuando se descubre que no puede continuar su flujo normal de ejecución (ha ocurrido un error en la transacción).
Abortada: después de retroceder la transacción y devolver la base de datos al estado previo al comienzo de su ejecución (ROLLBACK).
En esta situación el sistema puede:
  • Reiniciar la transacción.
  • Cancelar la transacción.
Comprometida: completada correctamente.
Una transacción terminada es aquella que está comprometida o abortada.

 

Estados_transaccion

Diagrama de estados de una transacción

 

Ejecución de transacciones

Para indicar a la base de datos que se trata de una transacción se delimitan las operaciones mediante las instrucciones BEGIN TRANSACTION y END TRANSACTION. La secuencia de operaciones que estén en su interior formará parte de la transacción.

 

ORACLE

BEGIN...END

Ejemplo: Insertar un nuevo registro en la tabla regions

Cuando ejecutamos esto, vemos que la base de datos actúa sobre una fila de la tabla regions, pero no actualiza los datos, quedando parcialmente comprometida.

Esto se debe a que debemos realizar un COMMIT de forma explicita para que la transacción quede comprometida.

 

Ahora, la transacción ha quedado comprometida.

 

ROLLBACK

El comando ROLLBACK deshace todo lo ejecutado en la transacción hasta el último COMMIT ejecutado.

Se inserta el registro (5, Mordor).

 

En este caso, al ejecutar el ROLLBACK, se deshace la transacción hasta el último COMMIT.

 

SAVEPOINT

El comando SAVEPOINT crea un punto de restauracion de la base de datos dentro de una transacción con un nombre identificador. Si la transacción actual tiene un punto con el mismo nombre, el antiguo se borra y se crea el nuevo.

El comando ROLLBACK TO SAVEPOINT nos devuelve al punto de restauración especificado.

Ahora solo se habrá ejecutado la inserción del nuevo registro, pero no la actualización, porque cuando realizamos el rollback to savepoint p1, volvemos a ese punto de restauración.

 

Para controlar las excepciones podemos usar el comando EXCEPTION WHEN OTHERS, el cual se utiliza para capturar y manejar cualquier tipo de excepción que no haya sido manejada de manera explícita.

En este caso, como la transacción es correcta, se ejecuta el COMMIT y se compromete la transacción.

 

En este otro caso, al insertar los valores (11, 'Rivendell') coincide el ID con el insertado en la transacción anterior, se captura la excepción con EXCEPTION WHEN OTHERS y nos devuelve al punto de restauración creado.

 

MariaDB

En mysql es ligeramente distinto a ORACLE.

 

PROCEDURE

En este caso hay que crear un un procedimiento almacenado PROCEDURE, el cual contiene un bloque específico de código que maneja cierta lógica o tarea.

Los procedimientos almacenados son programas que se almacenan en la base de datos y se pueden invocar desde otras partes del código SQL o desde aplicaciones externas.

 

CALL

La palabra clave CALL se utiliza para invocar a un procedimiento almacenado.

 

HANDLER

HANDLER se refiere comúnmente a un manejador de excepciones.

Un manejador de excepciones se utiliza para gestionar situaciones excepcionales o errores que pueden ocurrir durante la ejecución de un procedimiento o de una serie de instrucciones SQL.

 

START TRANSACTION

La sentencia START TRANSACTION se utiliza para iniciar una transacción explícitamente.

Este procedimiento ejecuta la inserción de tres nuevos empleados en la base de datos.

 

Ahora imaginemos el siguiente ejemplo:

En este caso, como el atributo ID coincide, se captura la excepción, la cual ejecuta el ROLLBACK, deshaciendo la transacción.

 

SAVEPOINT

El comando SAVEPOINT crea un punto de restauracion de la base de datos dentro de una transacción con un nombre identificador. Si la transacción actual tiene un punto con el mismo nombre, el antiguo se borra y se crea el nuevo.

Para indicarle al procedimiento a que punto de restauración queremos dirigirnos en caso de error, lo indicamos en el HANDLER

Ahora solo se habrá ejecutado la inserción de un solo registro, porque como el atributo ID de la tercera inserción coincide, se captura la excepción, la cual ejecuta el ROLLBACK hasta el punto de restauración marcado.

 

Otro ejemplo de procedimiento:

En este caso, si al insertar un registro nuevo se produjera un error, no se ejecutaría la transacción.

 

by Jose Manuel Pinillos